/**
 * 消息处理工具函数
 */

/**
 * 处理聊天消息
 * @param {Object} message 消息对象
 * @param {Array} messages 消息数组
 * @returns {Array} 更新后的消息数组
 */
export const handleChatMessage = (message, messages) => {
  console.log("处理聊天消息, 当前消息数:", messages.length);

  // 检查是否是WebSocket直接推送的消息格式(包含type和data)
  let actualMessage = message;
  if (message.type === "msg" && message.data) {
    console.log("这是WebSocket推送的消息，提取data部分:", message.data);
    actualMessage = message.data;
  }

  // 检查是否是弹幕消息
  if (actualMessage.type === "barrager") {
    console.log("检测到弹幕消息:", actualMessage);
    return handleBarragerMessage(actualMessage, messages);
  }

  // 检查是否是红包领取通知
  if (
    actualMessage.type === "redPacketStatus" &&
    actualMessage.whoGot &&
    actualMessage.whoGive
  ) {
    console.log("检测到红包领取通知:", actualMessage);
    return handleRedPacketNotice(actualMessage, messages);
  }

  // 检查是否是设置话题的消息格式：[setdiscuss]新话题[/setdiscuss]
  if (actualMessage.content && typeof actualMessage.content === "string") {
    const setDiscussRegex = /\[setdiscuss\](.*?)\[\/setdiscuss\]/;
    const match = actualMessage.content.match(setDiscussRegex);

    if (match && match[1]) {
      console.log("检测到设置话题的消息:", match[1]);
      // 在消息列表中添加系统提示，而不是添加用户的原始消息
      const systemMessage = {
        oId: `system_${Date.now()}`,
        userAvatarURL: "https://file.fishpi.cn/favicon.png",
        userName: "系统",
        userNickname: "系统消息",
        time: new Date().toISOString(),
        content: `${actualMessage.userName} 正在修改话题为：${match[1]}，消耗16积分`,
        _isSystemMsg: true,
      };

      // 添加系统消息
      return [...messages, systemMessage];
    }
  }

  // 获取消息的唯一标识
  const messageId =
    actualMessage.oId ||
    (actualMessage.time && new Date(actualMessage.time).getTime());

  if (!messageId) {
    console.error("消息没有有效的标识:", actualMessage);
    return messages;
  }

  // 检查消息是否已存在
  const existingMessageIndex = messages.findIndex(
    (m) => m.oId && m.oId === messageId
  );

  if (existingMessageIndex >= 0) {
    console.log("消息已存在，不重复添加:", messageId);
    return messages;
  }

  // 使用不可变方式更新数组
  return [...messages, { ...actualMessage }];
};

/**
 * 处理弹幕消息
 * @param {Object} message 弹幕消息对象
 * @param {Array} messages 消息数组
 * @returns {Array} 更新后的消息数组
 */
export const handleBarragerMessage = (message, messages) => {
  console.log("处理弹幕消息:", message);

  // 弹幕消息不需要添加到聊天记录中，但我们需要触发弹幕显示
  // 在ChatWebSocket中会处理显示弹幕

  // 返回原消息数组，不做修改
  return messages;
};

/**
 * 处理红包领取通知
 * @param {Object} notice 红包领取通知数据
 * @param {Array} messages 消息数组
 * @returns {Array} 更新后的消息数组
 */
export const handleRedPacketNotice = (notice, messages) => {
  if (!notice || !notice.whoGot || !notice.whoGive) {
    console.log("handleRedPacketNotice: 红包通知缺少必要信息");
    return messages;
  }

  console.log("处理红包领取通知:", JSON.stringify(notice));
  console.log(
    "通知信息：",
    notice.whoGot,
    "领取了",
    notice.whoGive,
    "发的红包"
  );

  // 先处理红包状态更新
  let updatedMessages = messages;

  // 如果通知中包含msgId或oId，尝试更新对应红包的状态
  if (notice.msgId || notice.oId) {
    console.log("红包领取通知中包含ID信息，尝试更新红包状态");

    const temp = { ...notice };
    // 移除处理通知特有的字段，避免干扰状态更新逻辑
    delete temp.whoGot;
    delete temp.whoGive;

    // 调用状态更新函数，但不处理通知逻辑(第三个参数为true)
    updatedMessages = handleRedPacketStatus(temp, messages, true);
  }

  // 创建一个系统通知消息
  const systemMessage = {
    oId: `redpacket_notice_${notice.oId || notice.msgId || Date.now()}`,
    userAvatarURL: "https://file.fishpi.cn/favicon.png",
    userName: "系统",
    userNickname: "系统消息",
    time: new Date().toISOString(),
    content: `${notice.whoGot} 领取了 ${notice.whoGive} 发的红包`,
    _isSystemMsg: true,
    _isRedPacketNotice: true,
  };

  console.log("创建红包通知系统消息:", systemMessage);

  // 添加到消息列表
  const resultMessages = [...updatedMessages, systemMessage];
  console.log("添加红包通知后的消息数量:", resultMessages.length);

  return resultMessages;
};

/**
 * 处理消息撤回
 * @param {Object} data 撤回消息数据
 * @param {Array} messages 消息数组
 * @returns {Array} 更新后的消息数组
 */
export const handleRevokeMessage = (data, messages) => {
  if (!data || !data.oId) return messages;

  // 找到对应消息的索引
  const index = messages.findIndex((m) => m.oId === data.oId);

  // 如果找到了消息，则删除
  if (index >= 0) {
    const newMessages = [...messages];
    newMessages.splice(index, 1);
    return newMessages;
  }

  return messages;
};

/**
 * 处理红包状态更新
 * @param {Object} data 红包状态数据
 * @param {Array} messages 消息数组
 * @param {boolean} skipNoticeCheck 是否跳过通知检查
 * @returns {Array} 更新后的消息数组
 */
export const handleRedPacketStatus = (
  data,
  messages,
  skipNoticeCheck = false
) => {
  if (!data) {
    console.log("handleRedPacketStatus: 收到的数据为空");
    return messages;
  }

  console.log("handleRedPacketStatus 处理数据:", JSON.stringify(data));

  const statusData = data.data || data;

  // 如果是红包领取通知，并且不是被前面的处理函数调用(且不跳过通知检查)
  if (
    !skipNoticeCheck &&
    statusData.type === "redPacketStatus" &&
    statusData.whoGot &&
    statusData.whoGive
  ) {
    console.log("检测到红包领取通知，交给handleRedPacketNotice处理");
    return handleRedPacketNotice(statusData, messages);
  }

  if (!statusData.oId && !statusData.msgId) {
    console.log("handleRedPacketStatus: 无法找到消息ID (oId或msgId)");
    return messages;
  }

  // 查找并更新红包消息
  const redPacketMsgId = statusData.msgId || statusData.oId;
  console.log("寻找红包消息ID:", redPacketMsgId);

  const msgIndex = messages.findIndex((msg) => msg.oId === redPacketMsgId);
  console.log(
    "查找结果索引:",
    msgIndex,
    msgIndex !== -1 ? "找到消息" : "未找到消息"
  );

  if (msgIndex !== -1) {
    try {
      const targetMsg = messages[msgIndex];
      console.log("找到的目标消息:", targetMsg.oId);

      if (
        targetMsg.content &&
        targetMsg.content.trim().startsWith("{") &&
        targetMsg.content.trim().endsWith("}")
      ) {
        console.log("目标消息内容类型正确，尝试解析JSON");
        const content = JSON.parse(targetMsg.content);
        console.log("解析后的内容:", content);

        if (content.msgType !== "redPacket") {
          console.log("不是红包消息，msgType:", content.msgType);
          return messages;
        }

        // 获取红包总数量
        const totalCount = content.totalCount || content.count || 0;
        console.log("红包总数量:", totalCount);

        // 计算已领取数量
        let gotCount = 0;
        if (statusData.got && typeof statusData.got === "number") {
          gotCount = statusData.got;
          console.log("从statusData.got获取已领取数量:", gotCount);
        } else if (statusData.count && typeof statusData.count === "number") {
          gotCount = statusData.count;
          console.log("从statusData.count获取已领取数量:", gotCount);
        } else if (statusData.got && Array.isArray(statusData.got)) {
          gotCount = statusData.got.length;
          console.log("从statusData.got数组长度获取已领取数量:", gotCount);
        } else {
          console.log("无法从状态数据中获取已领取数量，状态数据:", statusData);
        }

        // 计算剩余数量
        const leftCount = Math.max(0, totalCount - gotCount);
        console.log("计算剩余数量:", leftCount);

        // 判断是否已经领完
        const isOver = leftCount === 0;
        console.log("红包是否已领完:", isOver);

        // 比较旧状态
        console.log("更新前的红包状态:", {
          leftCount: content.leftCount,
          isOver: content.isOver,
        });

        console.log("更新后的红包状态:", {
          leftCount: leftCount,
          isOver: isOver,
        });

        // 检查是否有变化或需要强制更新
        if (
          !statusData._forceUpdate &&
          content.leftCount === leftCount &&
          content.isOver === isOver
        ) {
          console.log("红包状态没有变化，无需更新");
          return messages;
        }

        // 更新红包状态
        const updatedContent = JSON.stringify({
          ...content,
          leftCount: leftCount,
          isOver: isOver,
          _lastUpdated: Date.now(), // 添加更新时间戳
        });

        // 更新消息内容
        const newMessages = [...messages];
        newMessages[msgIndex] = {
          ...targetMsg,
          content: updatedContent,
        };

        console.log("红包状态已更新");
        return newMessages;
      } else {
        console.log("目标消息内容不是JSON格式:", targetMsg.content);
      }
    } catch (e) {
      console.error("处理红包状态更新失败", e);
    }
  } else {
    console.log("未找到对应的红包消息，可能是新发送的或者已经被移除");
  }

  return messages;
};

/**
 * 复制消息内容
 * @param {Object} message 消息对象
 * @returns {string} 处理后的消息内容
 */
export const extractMessageContent = (message) => {
  if (!message || !message.content) return "";

  // 提取纯文本内容
  let content = message.content.replace(/<[^>]*>/g, "");

  // 过滤掉小尾巴内容
  content = content
    .split("\n")
    .filter((line) => !line.trim().startsWith(">"))
    .join("\n");

  return content;
};

/**
 * 处理引用数据
 * @param {Object} message 消息对象
 * @returns {Object} 引用数据
 */
export const prepareQuoteData = (message) => {
  if (!message) return null;

  // 提取用户名
  const userName = message.userName || message.userNickname || "用户";

  // 提取消息内容 - 移除HTML标签
  let content = "";
  if (message.content) {
    content = message.content.replace(/<[^>]*>/g, "");
    // 限制长度
    if (content.length > 30) {
      content = content.substring(0, 30) + "...";
    }
  }

  // 返回引用数据
  return {
    userName: userName,
    content: content,
    oId: message.oId || "",
  };
};

/**
 * 处理讨论话题更改
 * @param {Object} data 话题数据
 * @returns {Object} 处理结果
 */
export const handleDiscussionChange = (data) => {
  if (!data) return { topic: "", message: "" };

  const statusData = data.data || data;
  if (!statusData.newDiscuss) return { topic: "", message: "" };

  const newTopic =
    statusData.newDiscuss !== "暂无" ? statusData.newDiscuss : "";
  const message = `${statusData.whoChanged || "有人"}将话题改为：${newTopic}`;

  return {
    topic: newTopic,
    message: message,
  };
};

/**
 * 处理系统消息
 * @param {Object} message 系统消息对象
 * @param {Array} messages 消息数组
 * @returns {Array} 更新后的消息数组
 */
export const handleSystemMessage = (message, messages) => {
  console.log("处理系统消息:", message);

  // 提取消息内容
  let content = "";

  if (message.message) {
    // 处理customMessage类型数据
    content = message.message;
  } else if (message.data && message.data.message) {
    // 处理嵌套在data中的情况
    content = message.data.message;
  } else if (typeof message === "string") {
    // 处理纯文本消息
    content = message;
  } else {
    // 如果无法提取有效内容，使用默认消息
    content = "系统消息";
    console.warn("无法从系统消息中提取内容:", message);
  }

  // 创建系统消息对象
  const systemMessage = {
    oId: `system_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
    userAvatarURL: "https://file.fishpi.cn/favicon.png",
    userName: "系统",
    userNickname: "系统消息",
    time: new Date().toISOString(),
    content: content,
    _isSystemMsg: true,
  };

  console.log("创建系统消息:", systemMessage);

  // 添加到消息列表
  return [...messages, systemMessage];
};
